package com.example.venue_reservation_service.utils;

import com.example.venue_reservation_service.exception.ImageValidateException;
import org.springframework.web.multipart.MultipartFile;
import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;
import java.io.IOException;
import java.util.Iterator;
import java.util.Set;

public class ImageValidator {

    // 允许的图片扩展名（小写）
    private static final Set<String> ALLOWED_EXTENSIONS = Set.of("jpg", "jpeg", "png", "gif", "bmp", "webp");
    // 250MB 字节限制 (250 * 1024 * 1024)
    private static final long MAX_SIZE_BYTES = 262144000L;

    // 修改后的文件校验方法（抛出异常）
    public static void validateImageFileWithException(MultipartFile file) {
        if (file == null || file.isEmpty()) {
            throw new ImageValidateException("文件为空", "FILE_EMPTY");
        }

        if (file.getSize() > ImageValidator.MAX_SIZE_BYTES) {
            throw new ImageValidateException("文件大小超过限制", "FILE_SIZE");
        }

        String originalName = file.getOriginalFilename();
        if (originalName == null || originalName.lastIndexOf(".") == -1) {
            throw new ImageValidateException("文件无扩展名", "FILE_EXT");
        }

        String extension = originalName.substring(originalName.lastIndexOf(".") + 1).toLowerCase();
        if (!ImageValidator.ALLOWED_EXTENSIONS.contains(extension)) {
            throw new ImageValidateException("不支持的文件类型", "FILE_TYPE");
        }

        try (ImageInputStream iis = ImageIO.createImageInputStream(file.getInputStream())) {
            if (iis == null) {
                throw new ImageValidateException("无法读取文件内容", "FILE_READ");
            }
            Iterator<ImageReader> readers = ImageIO.getImageReaders(iis);
            if (!readers.hasNext()) {
                throw new ImageValidateException("不是有效的图片文件", "FILE_FORMAT");
            }
        } catch (IOException e) {
            throw new ImageValidateException("文件读取失败: " + e.getMessage(), "FILE_IO");
        }
    }

    /**
     * 验证是否为图片文件且大小<250MB
     * @param file MultipartFile对象
     * @return true=验证通过, false=验证失败
     */
    public static boolean validateImageFile(MultipartFile file) {
        // 1. 基础检查
        if (file == null || file.isEmpty()) {
            return false; // 空文件直接拒绝[3,5](@ref)
        }

        // 2. 验证文件大小
        if (file.getSize() > MAX_SIZE_BYTES) {
            return false; // 超过250MB[6,7](@ref)
        }

        // 3. 校验扩展名
        String originalName = file.getOriginalFilename();
        if (originalName == null || originalName.lastIndexOf(".") == -1) {
            return false; // 无扩展名文件[5](@ref)
        }
        String extension = originalName.substring(originalName.lastIndexOf(".") + 1).toLowerCase();
        if (!ALLOWED_EXTENSIONS.contains(extension)) {
            return false; // 扩展名不在白名单[5](@ref)
        }

        // 4. 通过文件头验证真实格式（防止伪扩展名）
        try (ImageInputStream iis = ImageIO.createImageInputStream(file.getInputStream())) {
            if (iis == null) return false; // 无法创建流

            Iterator<ImageReader> readers = ImageIO.getImageReaders(iis);
            return readers.hasNext(); // 存在ImageReader说明是有效图片[2,5](@ref)
        } catch (IOException e) {
            return false; // 读取异常视为非图片
        }
    }
}